home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / docs / rakup / match.vl < prev    next >
Lisp/Scheme  |  1998-10-03  |  3KB  |  130 lines

  1. ;
  2. ; match.vl : âpâ^ü[âôâ}âbâ`âôâO
  3. ;
  4. ;            Copyright (C) 1998 by Makoto Hiroi
  5. ;
  6.  
  7. ;
  8. ; üEò╧Éöé═ëpæσò╢ÄÜé┼Äné▄éΘâVâôâ{âï
  9. ; üEɼî≈é═ò╧Éöæ⌐ö¢é≡ò╘é╖
  10. ; üEÄ╕ösé═ fail é≡ò╘é╖
  11. ; üEû│û╝ò╧Éöé═û│é╡
  12. ;
  13.  
  14. ;
  15. ; ò╧Éöé≡â`âFâbâNé╖éΘ
  16. (defun variablep (pattern)
  17.   (and (symbolp pattern)
  18.        (upper-case-p (char pattern 0))))
  19.  
  20. ;
  21. ; ò╧Éöæ⌐ö¢é╔Æ╟ë┴é╖éΘ
  22. ;
  23. (defun add-binding (var value binding)
  24.   (cons (cons var value) binding))
  25.  
  26. ;
  27. ; â}âbâ`âôâO : datum é╔ò╧Éöé═û│é╡
  28. ;
  29. (defun match (pattern datum binding)
  30.   (cond ((variablep pattern)
  31.          (match-variable pattern datum binding))
  32.         ((and (atom pattern) (atom datum))
  33.          (match-atoms pattern datum binding))
  34.         ((and (consp pattern) (consp datum))
  35.          (match-pieces pattern datum binding))
  36.         (t 'fail)))
  37.  
  38. ;
  39. ; ò╧Éöé╞é╠â}âbâ`âôâO
  40. ;
  41. (defun match-variable (var datum binding)
  42.   (let ((value (assoc var binding)))
  43.     (if value
  44.         ; Ælé≡Ägé┴é─éαéñêΩôxâ`âFâbâN
  45.         (match (cdr value) datum binding)
  46.         ; ò╧Éöæ⌐ö¢é╔Æ╟ë┴é╖éΘ
  47.         (add-binding var datum binding))))
  48.  
  49. ;
  50. ; âAâgâÇô»Ämé╠â}âbâ`âôâO
  51. ;
  52. (defun match-atoms (pattern datum binding)
  53.   (if (equal pattern datum) binding 'fail))
  54.  
  55. ;
  56. ; âèâXâgô»Ämé╠â}âbâ`âôâO
  57. ;
  58. (defun match-pieces (pattern datum binding)
  59.   (let ((result (match (car pattern) (car datum) binding)))
  60.     (if (eq result 'fail)
  61.         'fail
  62.         (match (cdr pattern) (cdr datum) result))))
  63.  
  64.  
  65. ;
  66. ; âåâjâtâBâPü[âVâçâô : pattern, datum é╞éαé╔ò╧Éöé¬ôⁿé┴é─éóéΘ
  67. ;
  68. (defun unify (pattern datum binding)
  69.   (cond ((variablep pattern)
  70.          (unify-variable pattern datum binding))
  71.         ((variablep datum)
  72.      (unify-variable datum pattern binding))
  73.         ((and (atom pattern) (atom datum))
  74.          (unify-atoms pattern datum binding))
  75.         ((and (consp pattern) (consp datum))
  76.          (unify-pieces pattern datum binding))
  77.         (t 'fail)))
  78.  
  79. ;
  80. ; âAâgâÇé╞é╠âåâjâtâBâPü[âVâçâô
  81. ;
  82. (defun unify-atoms (pattern datum binding)
  83.   (if (equal pattern datum) binding 'fail))
  84.  
  85. ;
  86. ; âèâXâgé╠âåâjâtâBâPü[âVâçâô
  87. ;
  88. (defun unify-pieces (pattern datum binding)
  89.   (let ((result (unify (car pattern) (car datum) binding)))
  90.     (if (eq result 'fail)
  91.         'fail
  92.         (unify (cdr pattern) (cdr datum) result))))
  93.  
  94. ;
  95. ; ò╧Éöé╞é╠âåâjâtâBâPü[âVâçâô
  96. ;
  97. (defun unify-variable (pattern datum binding)
  98.   (let ((value (assoc pattern binding)))
  99.     (if (and value
  100.              ; ((X . X) ... ) é┼û│î└âïü[âvé╔é╚éτé╚éóéµéñé╔é╖éΘé╜é▀
  101.              (not (eq pattern (cdr value))))
  102.         (unify (cdr value) datum binding)
  103.         (if (insidep pattern datum binding)
  104.             'fail
  105.             (add-binding pattern datum binding)))))
  106.  
  107. ;
  108. ; datum é╠Æåé╔ var(ò╧Éö)é¬éáéΘé⌐
  109. ;
  110. (defun insidep (var datum binding)
  111.   (if (eq var datum)
  112.       nil
  113.       (inside-sub-p var datum binding)))
  114.  
  115.  
  116. (defun inside-sub-p (var datum binding)
  117.   (cond ((equal var datum) t)
  118.         ((atom datum) nil)
  119.         ((variablep datum)
  120.          (let ((value (assoc datum binding)))
  121.            (if value
  122.                (inside-sub-p var (cdr value) binding))))
  123.         (t ; list é╠ÅΩìç
  124.          (or (inside-sub-p var (car datum) binding)
  125.              (inside-sub-p var (cdr datum) binding)))))
  126.                     
  127.  
  128. ; end of file
  129.